home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / oper_sys / emerald / emrldsys.lha / Kernel / Em / item.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-08-17  |  2.9 KB  |  92 lines

  1.  
  2. /* Copyright 1986 Eric Jul.  May not be used for any purpose without    */
  3. /* written permission from the author.                            */
  4. /* The Emerald kernel for the Emerald programming language.             */
  5.  
  6. /* This file contains the implementation of the Emerald item handler    */
  7.  
  8. #include "Kernel/h/assert.h"
  9. #include "Kernel/h/system.h"
  10. #include "Kernel/h/errMsgs.h"
  11. #include "Kernel/h/emTypes.h"
  12. #include "Kernel/h/kmdTypes.h"
  13. #include "Kernel/h/emCodes.h"
  14. #include "Kernel/h/mmMsgTypes.h"
  15. #include "Kernel/h/lmTypes.h"
  16. #include "Kernel/h/emkDefs.h"
  17. #include "Kernel/h/lmCodes.h"
  18. #include "Kernel/h/utils.h"
  19.  
  20. ItemHandlerPtr              handlers[MAXTAG];
  21. static int                  initialized = 0;
  22.  
  23. /**********************************************************************/
  24. /*  Item Handler                                                      */
  25. /**********************************************************************/
  26.  
  27. HResult ItemHandler(fHandle)
  28. LMHandle         fHandle;
  29. {
  30.     ItemHdr                 hdr;
  31.     int                     length;
  32.     register ItemHandlerPtr theItemHandler;
  33.     
  34.     KMDTrace("Item", 3, "ItemHandler from LNN %d\n",
  35.     fHandle->mmMsgHdr.MsgSrc);
  36.     for (;;) {
  37.     length = sizeof(hdr);
  38.     LMGetData(&fHandle, &hdr, &length);
  39.     if (length == 0) {
  40.         break;
  41.     }
  42.     if (length < sizeof(hdr)) {
  43.         ErrMsg("Bad Item in Long Msg\n");
  44.         break;
  45.     }
  46.     assert ( (int) hdr.itemTag < MAXTAG);
  47.         KMDTrace("Item", 3, "Item: ITag %s, size %d\n", PPITag(hdr.itemTag),
  48.         hdr.size);
  49.     theItemHandler = handlers[(int) hdr.itemTag];
  50.     assert(NonNULL(theItemHandler));
  51.     KMDTrace("Item", 5, "Invoking handler no. %d at addr 0x%05x\n",
  52.         hdr.itemTag, theItemHandler);
  53.     (*theItemHandler)(&fHandle, hdr);
  54.     }
  55.     LMClose(&fHandle);
  56. }
  57.  
  58. /**********************************************************************/
  59. /*  SetItemHandler                                                    */
  60. /**********************************************************************/
  61.  
  62. void SetItemHandler(fTag, fHandler)
  63. ITag                        fTag;
  64. ItemHandlerPtr              fHandler;
  65. {
  66.     register    int     i;
  67.     KMDTrace("Item", 5, "SetItemHandler[%d] to addr 0x%05x, ITag %s\n", fTag,
  68.     fHandler, PPITag(fTag));
  69.     assert( (unsigned int) fTag < MAXTAG);
  70.     if (!initialized) {
  71.     initialized = 1;
  72.     for (i = 0; i < MAXTAG; i++) handlers[i] = (ItemHandlerPtr) NULL;
  73.     }    
  74.     handlers[(unsigned int) fTag] = fHandler;
  75. }
  76. /**********************************************************************/
  77. /*  Item initialization                                               */
  78. /**********************************************************************/
  79.  
  80. void ItemInit()
  81. {
  82.     KMDSetTrace(Item);
  83.     KMDTrace("Item", 5, "ItemInit, sizeof(ItemHdr) is %d bytes, MAXTAG %d\n",
  84.     sizeof(ItemHdr), MAXTAG);
  85.     MMDefineMsgHandler(KMSG_EmKernel, EMKM_Item, (HandlerPtr)ItemHandler,
  86.       (HandlerPtr *)NULL);
  87. }
  88.  
  89. /**********************************************************************/
  90.  
  91. /* Copyright 1986 Eric Jul */
  92.